package com.zjsru.leetcode75.level1;

/**
 * @Author: cookLee
 * @Date: 2023-10-05
 * 定长子串中元音的最大数目
 */
public class MaxVowels {

    /**
     * 主
     * \
     * 输入：s = "abciiidef", k = 3
     * 输出：3
     * 解释：子字符串 "iii" 包含 3 个元音字母。
     * \
     * 输入：s = "aeiou", k = 2
     * 输出：2
     * 解释：任意长度为 2 的子字符串都包含 2 个元音字母
     * \
     * 输入：s = "leetcode", k = 3
     * 输出：2
     * 解释："lee"、"eet" 和 "ode" 都包含 2 个元音字母。
     * \
     * 输入：s = "rhythms", k = 4
     * 输出：0
     * 解释：字符串 s 中不含任何元音字母。
     * @param args args
     */
    public static void main(String[] args) {
        MaxVowels maxVowels = new MaxVowels();
        String s = "abciiidef";
        int k = 3;
        System.out.println(maxVowels.maxVowels(s, k));
    }

    static boolean[] hash = new boolean[128];

    static char[] vowels = new char[]{'a', 'e', 'i', 'o', 'u'};

    static char CHARACTER_EMPTY = ' ';

    /**
     * 做一次映射：将对应的元音转化到哈希表上
     */
    static {
        for (char c : vowels) {
            hash[c - CHARACTER_EMPTY] = hash[Character.toUpperCase(c) - CHARACTER_EMPTY] = true;
        }
    }

    /**
     * 最大元音:双指针
     *
     * @param s s
     * @param k k
     * @return int
     */
    private int maxVowels(String s, int k) {
        int count = 0;
        int ans = 0;
        char[] chars = s.toCharArray();
        int left = 0, right = k - 1;
        count = this.getVowelsCount(chars, left, right);
        ans = count;
        while (right < chars.length - 1) {
            right++;
            if (hash[chars[right] - CHARACTER_EMPTY]) {
                count++;
            }
            if (hash[chars[left] - CHARACTER_EMPTY]) {
                count--;
            }
            left++;
            //记录最大的总数
            ans = Math.max(count,ans);
        }
        return ans;
    }

    /**
     * 获取元音计数
     *
     * @param chars 字符
     * @param left  左
     * @param right 右侧
     * @return int
     */
    private int getVowelsCount(char[] chars, int left, int right) {
        int count = 0;
        for (int i = left; i <= right; i++) {
            if (hash[chars[i] - CHARACTER_EMPTY]) {
                count++;
            }
        }
        return count;
    }

}
